\documentclass[%
    %draft,
    %submission,
    %compressed,
    a4paper,
    %12pt,
    10pt,
    final,
    %technote,
    %internal,
    %submitted,
    %inpress,
    %reprint,
    %titlepage,
    notitlepage,
    %anonymous,
    narroweqnarray,
    inline,
    oneside,
    %invited,
    %conference
    article
    ]{ieee}

%\documentclass[a4paper,11pt]{article}
\usepackage[spanish]{babel}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsfonts}
\usepackage{graphicx}
\usepackage{multirow}
\usepackage{epsfig}
\usepackage{epstopdf}

\newcommand{\latexiie}{\LaTeX2{\Large$_\varepsilon$}}

\begin{document}

\title[]{
	Trabajo Práctico 2\\
	Redes Neuronales}

\author{
     Luciano Mangiarotti (I.T.B.A),
\and Federico Santos (I.T.B.A),
\and Jimena Pose (I.T.B.A) \\ \\ }

\maketitle


\section{Introducci\'on}


\noindent En este trabajo se tiene por objetivo analizar el comportamiento de una red neuronal o perceptrón multicapa y obtener conclusiones acerca de su comportamiento. Se implementa y entrena la red, evaluando su capacidad de memorización y generalización. \\

\noindent El entrenamiento y testeo de la red se realiza a partir de un conjunto de muestras que corresponden a puntos ubicados en el espacio. \\

\noindent Las características de estos datos es motivo de análisis, ya que es importante para la selección de los puntos que se usan para el entrenamiento y los que se usan para el testeo. \\

\noindent Para el análisis se emplean distintas arquitecturas de red y como funciones de activación se utilizan dos funciones no lineales sigmoideas que se explicarán en las secciones correspondientes. Se implementan además, dos mejoras para el algoritmo de \textit{back-propagation}. \\

\noindent En la Sección II se comenta la elección de los conjuntos de patrones para el entrenamiento y el testeo de la red. En la Sección III se explican las consideraciones y decisiones tomadas sobre la implementación de la red. \\

\noindent En la Sección IV se comentan las mejoras que se implementan para el algoritmo de \textit{back-propagation}. Por ultimo, en la Sección V se presentan y analizan los resultados obtenidos con las distintas arquitecturas junto con sus respectivas conclusiones.


\section{Conjunto de patrones}


\noindent Se dispone de un conjunto de $441$ pares ordenados $(x_1,x_2)$, los cuales tienen un tercer valor asociado que cumple el rol de resultado para $f(x_1,x_2)=z$. En la Figura \ref{grafico1} se grafican estos puntos en el espacio. \\

\noindent Analizando el gráfico no se observan sectores planos, sino que se trata de una superficie ondulada. Para el entrenamiento de la red no es necesario seleccionar una mayor cantidad de puntos en determinada zona, ya que todos los puntos son igualmente importantes y su dificultad para ser aprendidos es similar. \\ % Releer

\noindent La Figura \ref{grafico2} muestra la forma en que están distribuidos los pares $(x_1,x_2)$ en el plano. Estos pares pertenecen al conjunto de entradas de la red y pueden ser utilizados tanto para su entrenamiento como para su testeo. \\

\noindent En este último grafico se puede observar que el conjunto de puntos proporcionado esta distribuido de manera casi uniforme. \\

\noindent De esta forma, no hay zonas que tengan una concentración de puntos considerablemente distinta al resto. \\

\noindent La elección del conjunto de patrones de entrenamiento y testeo es de suma importancia para lograr una buena performance en el aprendizaje. \\

\noindent Es importante aclarar que los conjuntos de entrenamiento y de testeo que se usan en las pruebas presentadas son disjuntos. \\

\noindent Se decidió utilizar un subconjunto con el $80\%$ de las muestras proporcionadas para el entrenamiento de la red y el resto para el testeo. \\

\noindent Esta elección se debe a que es importante entrenar la red con una considerable cantidad de puntos para que se logre un buen aprendizaje. \\

\noindent Los valores se seleccionan al azar, ya que como se comentó anteriormente no hay ninguna zona con mayor dificultad para ser aprendida. \\

\noindent Hay que destacar que los conjuntos de entrenamiento y testeo se crean una sola vez y son iguales en todas las pruebas. \\

\noindent En la Figura \ref{grafico2}, los valores que se muestran en azul corresponden al conjunto de entrenamiento y los que se muestran en rojo son de testeo.


\section{Consideraciones de implementación}


\noindent Los pesos iniciales de la red son valores que se generan aleatoriamente y pertenecen al intervalo $(-0.8, 0.8)$. Estos valores se generan al comienzo de cada entrenamiento, y por este motivo los pesos obtenidos en entrenamientos distintos pueden no ser iguales. \\

\noindent Se elige este rango para la inicialización ya que en varias pruebas preliminares, se pudo observar que cuando los pesos iniciales pertenecen a intervalos más chicos como por ejemplo $(-0.1, 0.1)$ el error oscila más y su descenso resulta más lento. \\

\noindent Las arquitecturas de red analizadas tienen 1 o 2 capas ocultas y se varía la cantidad de neuronas en dichas capas, con el objetivo de evaluar y comparar la capacidad de memorización y generalización de cada configuración. \\

\noindent Se usan dos funciones no lineales como funciones de activación, tangnte hiperbólica (1) y exponencial (2) según las siguientes ecuaciones:
\begin{equation}
	g(h) = \tanh (\beta h)
\end{equation}
\begin{equation}
	g(h) = \frac{1}{1 + e^{-2 \beta h}}
\end{equation}

\noindent Es importante aclarar que siempre se utiliza la misma función de activación en todas las capas de la red. En este documento no se analiza ninguna red donde sus capas ocultas se activen con funciones distintas. \\

\noindent Se elige el valor $\beta = 0,7$, como parámetro de las funciones mencionadas. Esta elección tiene como objetivo reducir la posibilidad de saturación de las neuronas. \\

\noindent Si se elige un valor muy cercano a la unidad, las funciones son muy escalonadas y por lo tanto el rango de valores para el que saturan es menor. En cambio, con valores menores a $0,7$ se pierde la capacidad de decisión. \\

\noindent En la Figura \ref{grafico3} se grafica la función tangente hiperbólica (1) con el parámetro $\beta$ elegido. Dado que todos los datos proporcionados toman valores en el mismo dominio e imagen que la función de activación, la misma puede ser utilizada sin normalizar los patrones. \\

\noindent Hay que mencionar que hay algunos valores de salida del conjunto de patrones que son levemente mayores que $1$ o menores que $-1$. Como son pocos puntos y la diferencia no es superior a $0,05$ no se justifica una normalización. No obstante, en esos puntos se cometerá un error mayor sin importar lo buena que sea la arquitectura de la red. \\

\noindent Análogamente, en la Figura \ref{grafico4} se grafica la función exponencial (2) con el mismo valor de $\beta$. Se puede observar que la imagen de la función de activación exponencial está acotada en el intervalo $[0;1]$. \\

\noindent En este caso, la salida $z$ de los patrones deberá ser normalizada, ya que la misma toma valores en el intervalo $[-1;1]$. Los patrones se normalizan usando la siguiente ecuación:
\begin{equation}
	s'_i = \frac{s_i + 1}{2}, \forall i
\end{equation}

\noindent donde $s_i$ un es la coordenada $z$ del patrón $i$ mientras que $s'_i$ es su valor normalizado. De esta manera se logra obtener un conjunto de patrones donde todas las salidas están en el intervalo $[0;1]$. \\

\noindent Para ajustar los pesos en cada época se usa el error cuadrático medio. El método de actualización de pesos que se utiliza es el incremental, en el cuál se corrigen los pesos de la red cada vez que se presenta un patrón distinto. Es importante aclarar que la corrección de pesos es parte del entrenamiento de la red, y dicho ajuste se realiza presentado sólo patrones que pertenezcan al conjunto de entrenamiento.


\section{Mejoras realizadas}


\noindent Con el objetivo de mejorar la performance del algoritmo de \textit{back-propagation} se implementan y agregan las siguientes mejoras que se explican a continuación.

\subsection{$\eta$ adaptativo:}

\noindent El objetivo de esta mejora es ir variando el valor de la constante de proporcionalidad de aprendizaje $\eta$ de acuerdo a la variación del error entre distintas épocas. \\

\noindent Esta modificación se hace durante el entrenamiento según la siguiente expresión:
\begin{equation}
	\Delta \eta = \left\{
	\begin{array}{l}
		+a \hspace{0.65cm} si \hspace{0.2cm} \Delta E < 0 \hspace{0.2cm} (consistentemente) \\
		-b\eta \hspace{0.5cm} si \hspace{0.2cm} \Delta E > 0 \\
		0 \hspace{0.95cm} en \hspace{0.2cm} otro \hspace{0.2cm} caso
	\end{array} \right.
	\label{e_adap}
\end{equation}

\noindent donde $\Delta E$ es la variación del error. En esta implementación se toma al error de testeo, que es el error cuadrático medio obtenido al presentar todos los patrones de testeo a la red al final de cada época. \\

\noindent La palabra \textit{consistentemente} hace referencia a que el error siempre decrece durante $K$ pasos. Se considera cada época como un paso. En particular, cuando el error decrece durante $K$ épocas consecutivas se incrementa el $\eta$ en una constante $a$. \\

\noindent El valor inicial de $\eta$ es $0.5$, ya que permite que el error oscile un poco al principio y no se estanque. A medida que avanzan las épocas se va decrementando, lo que hace que el error oscile menos y comience a converger. \\

\noindent Experimentalmente y teniendo en cuenta la cantidad de épocas que se dedican al entrenamiento, se estipula un $K = 20$. También se determina que los mejores valores para las constantes en (\ref{e_adap}) son $a = b = 0.01$. \\

\noindent Si se usan valores más grandes, se corre el riesgo de que $\eta$ se incremente muy rápido y el error oscile demasiado. Si son muy pequeños, el efecto generado por la variación de $\eta$ es poco perceptible.


\subsection{Momentum:}


\noindent La segunda mejora consiste en sumar en la actualización de pesos, un porcentaje del valor de los pesos en la iteración anterior. El objetivo de la misma es suavizar ciertas oscilaciones bruscas en los pesos. \\

\noindent El porcentaje que se suma de los pesos anteriores es $\alpha = 0.01$. Se usa ese valor, ya que dándole un envión mayor a los pesos genera que las neuronas saturen más rápidamente. \\

\noindent En las pruebas realizadas para este informe, como se comenta más en detalle a lo largo de la próxima sección, el uso de \textit{momentum} no permitió obtener mejores resultados y en cambio, las neuronas se saturaron en casi todos los casos por lo que el aprendizaje no fue satisfactorio.


\section{Resultados y Conclusiones}


\noindent A continuación se presentan los resultados obtenidos al entrenar distintas redes con arquitecturas y funciones de activación diferentes. Se presentan los resultados con y sin el uso de las mejoras con el objetivo de comparar el rendimiento de la red en ambos casos. \\

\noindent Se decidió usar como criterio de corte para el entrenamiento una determinada cantidad de épocas fija para todos los casos. Esta decisión se toma por dos motivos que se detallan a continuación. \\

\noindent En primer lugar, el error obtenido con la función de activación tangente hiperbólica no es comparable con el de la exponencial ya que ambos errores se calculan a partir de salidas en distintos intervalos. Recordemos que cuando se usa la función exponencial, las salidas deben ser normalizadas. De esta forma no se puede determinar una cota de error homogénea para todas pruebas. \\

\noindent Por ultimo, se contempló la posibilidad de que a partir de una determinada cantidad de épocas de entrenamiento, el error de testeo de la red comience a incrementarse. Al tener una cantidad fija de épocas, se puede observar la evolución de ambos errores y sacar conclusiones al respecto. \\

\noindent En todas las pruebas que se presentan en este informe, las red se entrenó durante $3000$ épocas. Este valor fue determinado de manera experimental, observando que a partir de esa cantidad la variación del error en todos los casos era despreciable. \\

\noindent Dado que el error cuadrático medio se calcula a partir de la suma de los cuadrados de los errores cometidos en cada patrón y se lo divide por 2, cuando la cantidad de patrones es distinta los resultados no son comparables. \\

\noindent Como se quiere comparar la capacidad de generalización y memorización de la red y la cantidad de patrones de entrenamiento y testeo es distinta, resulta interesante conocer el error que se comete en promedio por cada patrón. \\

\noindent El error promedio por patrón se puede calcular a partir del error cuadrático medio según la siguiente ecuación:
\begin{equation}
	e_{patron} = \sqrt{\frac{2E}{p}}
\end{equation}

\noindent donde $E$ es el error cuadrático medio y $p$ la cantidad de patrones. La multiplicación por 2 se realiza ya que en el cómputo del error cuadrático medio se efectúa la división por ese valor. \\

\noindent En las tablas, se representa la arquitectura de la red indicando la cantidad de capas ocultas y de salida, con su respectiva cantidad de neuronas, entre corchetes. \\

\noindent Por ejemplo, una red $[12-7-1]$ tiene 2 capas ocultas con 12 neuronas en la primer capa, 7 en la segunda y una en la salida. La cantidad de entradas depende de los patrones y es $2$ en todos los casos. \\

\noindent Los resultados que se muestran en las distintas tablas corresponden a los mejores resultados obtenidos en tres pruebas con la misma arquitectura y parámetros.


\subsection{Resultados con Tangente Hiperbólica:}


\noindent En la Tabla \ref{tab:tabla1} se presentan los resultados obtenidos del entrenamiento de la red usando como función de activación a la tangente hiperbólica en todas sus capas. \\

\noindent Se muestra el error cuadrático medio de generalización y memorización obtenido luego de $3000$ épocas. También se muestra en la Tabla \ref{tab:tabla2} el error promedio por patrón obtenido correspondiente a cada caso. \\

\noindent Se puede observar, que para todas las arquitecturas presentadas en la tabla \ref{tab:tabla1}, las distintas redes memorizan y generalizan mejor cuando se usa $\eta$ adaptativo. \\

\noindent Además, utilizando la mejora mencionada y la arquitectura $[12-7-1]$, se logra un error promedio por patrón menor que con las demás configuraciones. Esta configuración es la que genera mejores resultados en todos los casos. \\

\noindent Con las otras dos arquitecturas, se puede observar que el error obtenido es más grande, especialmente cuando no se usa $\eta$ adaptativo. \\

\noindent En particular, se puede observar que con la arquitectura $[30-30-1]$ se obtiene tiene un error promedio por patrón muy alto para los patrones utilizados. Claramente esta última arquitectura no logra aprender satisfactoriamente el conjunto de patrones, aún usando $\eta$ adaptativo. \\

\noindent Es interesante analizar en que casos la red memorizó mejor y en cuales generalizó mejor, a partir de los errores promedio por patrón que se muestran en la Tabla \ref{tab:tabla2}. \\

\noindent Con la arquitectura $[12-7-1]$ se observa que en todos los casos se obtiene un error promedio de memorización y generalización similar. \\

\noindent Esto denota que el haber logrado una buena memorización de los datos proporcionados a partir de una cantidad adecuada de patrones de entrenamiento, provee una buena generalización de aquellos patrones que no estaban incluidos en el conjunto de entrenamiento. \\

\noindent Para las demás arquitecturas que se presentan en esta tabla, los resultados obtenidos no fueron tan buenos. Esto se lo puede apreciar en base a la magnitud del error promedio por patrón. \\

\noindent  Se observa que el error de generalización es un poco mayor que el de memorización. Esto significa que la red memoriza mejor de lo que generaliza, siendo una consecuencia de haber agregado una mayor cantidad de neuronas en las capas ocultas.


\subsection{Resultados con la función Exponencial:}


\noindent En la Tablas \ref{tab:tabla3} y la Tabla \ref{tab:tabla4} se presentan los resultados obtenidos para redes con la misma arquitectura que las presentadas anteriormente, pero usando la función de activación exponencial (2) en todas las capas. \\

\noindent Observando el error cuadrático medio que se presenta en la Tabla \ref{tab:tabla3}, se llega a la conclusión de que con esta función de activación las redes aprenden mejor cuando no se usa $\eta$ adaptativo. No obstante, los resultados obtenidos con $\eta$ adaptativo también son aceptables. \\

\noindent En la Tabla \ref{tab:tabla4}, se puede observar que la diferencia entre los errores de memorización y generalización promedio por patrón es muy pequeña. En todos estos casos, esta diferencia está en la tercera cifra decimal. \\

\noindent A diferencia de los resultados obtenidos con la función de activación tangente hiperbólica, se observa que cuando se usa la función exponencial la red con arquitectura $[30-30-1]$ genera muy buenos resultados. \\

\noindent En particular, con dicha arquitectura mencionada y sin usar $\eta$ adaptativo se obtienen los mejores resultados entre todas las combinaciones analizadas para la función de activación exponencial. \\

\noindent De todas formas, no se puede decir que esta configuración es mejor o peor que las obtenidas con la tangente hiperbólica ya que el error se calcula en base a una salida que esta normalizada. Como los valores de salida se normalizan a un conjunto más acotado, el error resultante va a dar más chico.


\subsection{Evolución del error:}


\noindent En la Figura 5, se muestra la evolución del error cuadrático medio en el entrenamiento una red con una arquitectura $[12-7-1]$, con $\eta$ adaptativo de parámetros $a=b=0.01$ y no se usa \textit{momentum}. \\

\noindent En verde se grafica el error cuadrático medio de memorización y en azul el de generalización. Se puede observar que ambos errores decrecen de forma similar, alcanzando un valor asintótico a partir de las $750$ épocas. \\

\noindent Hay que destacar que el error de memorización es considerablemente mas grande que el de memorización, porque se calcula para una cantidad más grande de patrones. Como se explica al presentar las tablas, es necesario calcular el error promedio por patrón para poder hacer una comparación correcta. \\

\noindent En ninguno de los entrenamientos de las distintas redes y configuraciones presentadas se da el caso de que alguno de los errores crezca consistentemente a partir de una época determinada.


\subsection{Resultados con el uso del \textit{momentum:}}


\noindent No se presentan resultados de configuraciones de redes que utilizan \textit{momentum} en forma de tabla ya que los resultados que se obtuvieron no fueron satisfactorios en ninguna de las pruebas realizadas. \\

\noindent La explicación radica en que el hecho de agregarle \textit{momentum} hace que los potenciales de membrana de las neuronas se incrementen considerablemente, y por consiguiente, las salidas de las mismas tengan valores muy próximos al $-1$ y $1$ en el caso de la tangente hiperbólica o a $0$ y $1$ en caso de la exponencial. \\

\noindent Como en todas las pruebas se obtuvo una salida que se aproxima a los valores límite mencionados, se llega a la conclusión de que las neuronas se saturan. \\



% Los resultados con momentum divergen, o sea, las neuronas de saturan
% Con ETA adaptativo y la tanh se logran mejores resultados siempre que no usándolo
% Con la exponencial se logran resultados similares con y sin eta adaptativo
% Haciendo algunos cálculos, se puede ver que si bien en algunos casos se memoriza mejor de lo que generaliza, el error de memorizacion acompaña al de generalizacion, o sea que no se da un caso donde memorice muy bien y generalice muy mal ni viceversa. Esto siempre tomando el error promedio por patrón


% Figuras

\begin{figure*}
        \centering
		\includegraphics[scale=0.7]{grafico1.png}
        \caption{Gráfico de las muestras proporcionados}
        \label{grafico1}
\end{figure*}

\begin{figure*}
        \centering
		\includegraphics[scale=0.7]{grafico2.png}
        \caption{Distribución de las muestras proporcionados}
        \label{grafico2}
\end{figure*}

\begin{figure*}
        \centering
		\includegraphics[scale=0.7]{grafico3.png}
        \caption{Gráfico de la función tangente hiperbólica}
        \label{grafico3}
\end{figure*}

\begin{figure*}
        \centering
		\includegraphics[scale=0.7]{grafico4.png}
        \caption{Gráfico de la función exponencial}
        \label{grafico4}
\end{figure*}

\begin{figure*}
        \centering
		\includegraphics[scale=0.7]{grafico5.png}
        \caption{Evolución del error cuadrático medio}
        \label{grafico5}
\end{figure*}


% Tablas

\begin{table*}
	\centering
    	\begin{tabular}{c c c c c c}
    	\hline
    	\hline
	\multirow{2}{*}{\textbf{Arquitectura}} & \multirow{2}{*}{\textbf{$\eta$ adaptativo}} &  \multicolumn{2}{c}{\textbf{Error cuadrático medio}} \\
		& & \textbf{Generalización} & \textbf{Memorización}\\
	\hline
	\hline
		$[12-7-1]$ & SI & 0.0557186 & 0.222293\\
		$[12-7-1]$ & NO & 0.141438 & 0.481417\\
		$[50-1]$ & SI & 0.135171 & 0.447704\\
		$[50-1]$ & NO & 20.9524 & 78.0731\\ 
		$[30-30-1]$ & SI & 1.10884 & 3.71685 \\
		$[30-30-1]$ & NO & 29.085 & 99.3536\\
	\hline
	\end{tabular}
	\caption{Resultados del aprendizaje usando la tangente hiperbólica sin momentum.}
	\label{tab:tabla1}
\end{table*}

\begin{table*}
	\centering
    	\begin{tabular}{c c c c c c}
    	\hline
    	\hline
	\multirow{2}{*}{\textbf{Arquitectura}} & \multirow{2}{*}{\textbf{$\eta$ adaptativo}} &  \multicolumn{2}{c}{\textbf{Error promedio por patrón}} \\
		& & \textbf{Generalización} & \textbf{Memorización}\\
	\hline
	\hline
		$[12-7-1]$ & SI & 0.035585 & 0.035488 \\
		$[12-7-1]$ & NO & 0.056696 & 0.052226 \\
		$[50-1]$ & SI & 0.055426 & 0.050364 \\
		$[50-1]$ & NO & 0.690065 & 0.665086 \\ 
		$[30-30-1]$ & SI & 0.158747 & 0.145115 \\
		$[30-30-1]$ & NO & 0.813033 & 0.750273 \\
	\hline
	\end{tabular}
	\caption{Resultados del aprendizaje usando la tangente hiperbólica sin momentum, mostrando el error promedio por patrón.}
	\label{tab:tabla2}
\end{table*}

\begin{table*}
	\centering
    	\begin{tabular}{c c c c c c}
    	\hline
    	\hline
	\multirow{2}{*}{\textbf{Arquitectura}} & \multirow{2}{*}{\textbf{$\eta$ adaptativo}} &  \multicolumn{2}{c}{\textbf{Error cuadrático medio}} \\
		& & \textbf{Generalización} & \textbf{Memorización}\\
	\hline
	\hline
		$[12-7-1]$ & SI & 0.0542331 & 0.179344 \\
		$[12-7-1]$ & NO & 0.0269278 & 0.115057 \\
		$[50-1]$ & SI & 0.0551436 & 0.209111 \\
		$[50-1]$ & NO & 0.0165876 & 0.0679449 \\ 
		$[30-30-1]$ & SI & 0.0270678 & 0.10659 \\
		$[30-30-1]$ & NO & 0.0110691 & 0.0454724 \\
	\hline
	\end{tabular}
	\caption{Resultados del aprendizaje usando la exponencial sin momentum.}
	\label{tab:tabla3}
\end{table*}

\begin{table*}
	\centering
    	\begin{tabular}{c c c c c c}
    	\hline
	\hline
	\multirow{2}{*}{\textbf{Arquitectura}} & \multirow{2}{*}{\textbf{$\eta$ adaptativo}} &  \multicolumn{2}{c}{\textbf{Error promedio por patrón}} \\
		& & \textbf{Generalización} & \textbf{Memorización}\\
	\hline
	\hline
		$[12-7-1]$ & SI & 0.035107 & 0.031876  \\
		$[12-7-1]$ & NO & 0.024738 & 0.025531  \\
		$[50-1]$ & SI & 0.035401 & 0.034420 \\
		$[50-1]$ & NO & 0.019416 & 0.019620 \\ 
		$[30-30-1]$ & SI & 0.024802 & 0.024574 \\
		$[30-30-1]$ & NO & 0.01586 & 0.01605 \\
	\hline
	\end{tabular}
	\caption{Resultados del aprendizaje usando la exponencial sin momentum, mostrando el error promedio por patrón.}
	\label{tab:tabla4}
\end{table*}

%\begin{thebibliography}{1}
%\bibitem{1} Hertz J., Krogh A., Palmer R.G., \textit {Introduction to the Theory of Neural Computation}, Westview Press, 1991. Capítulo 6, Sección 4.
%\end{thebibliography}

\end{document}
